{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "86d7553b-e5c6-4d7f-8564-a8c31d5220b7",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 基于 MindSpore Quantum 实现 Adapt Clifford 算法求解 Maxcut 问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6cf90771-ec71-4dc5-8579-d897c0166a00",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## 1 问题背景：\n",
    "\n",
    "使用变分算法求解最大割问题面临训练成本高等问题，如果可以使用 Clifford 线路模拟求解最大割问题，就可以在经典计算机上高效求解。\n",
    "\n",
    "## 2 项目任务及实现方案：\n",
    "\n",
    "本项目的核心任务是实现浅层Clifford线路的 Adapt_Clifford 算法，启发来自 Adapt_QAOA，当把标准层Rzz门及参数$\\gamma^{(n)}$删去之后，仅使用混合层实现优化。发现线路只选取 YZ ZY 算符，并且混合层参数$\\beta^{(n)}=\\pm \\frac{\\pi}{4}$, 由此可看出 Clifford 线路求解 MaxCut 问题的潜力。\n",
    "\n",
    "## 3 Adapt Clifford 算法描述：\n",
    "![circ](./fig.png)\n",
    "\n",
    "从$|+\\rangle^{\\otimes N}$出发，随机选择一个初始比特t作用Z门，并将其标记为__激活比特__，其余N-1为__待激活比特__。从t出发开始计算算子池中每个算子的梯度，选择梯度值变化最大的那个算子，将其填入到线路中。每层添加一个Ryz门，同时激活一个比特，直到所有比特激活，因此只需N-1个Ryz门。\n",
    "\n",
    "Randomized 方法：随机选择一个比特\n",
    "\n",
    "Deterministic 方法：遍历所有比特，输出能量值最小的"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37a4025c-eefb-470d-a9f7-836323c63660",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "#### 1.1 生成一个MaxCut问题\n",
    "\n",
    "这里为Complete Graph，先定义一个邻接矩阵，权重为Uniform(0,1)分布。\n",
    "\n",
    "通过openqaoa的ground_state_hamiltonian接口求得其基态能量。最后计算出它的哈密顿量 $H_c=(\\frac{1}{2})\\sum_{i<j}Z_{i}Z_{j}$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "72852209-77a7-4f2b-b440-0b16753db57f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:15.129297Z",
     "iopub.status.busy": "2025-04-07T12:38:15.129297Z",
     "iopub.status.idle": "2025-04-07T12:38:15.247213Z",
     "shell.execute_reply": "2025-04-07T12:38:15.247213Z",
     "shell.execute_reply.started": "2025-04-07T12:38:15.129297Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def adj_matrix_complete(nodes):\n",
    "    mat = np.zeros((nodes, nodes))\n",
    "    for ii in range(nodes):\n",
    "        for jj in range(nodes):\n",
    "            if jj > ii: mat[ii, jj] = np.random.uniform(0, 1)\n",
    "    return mat + mat.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5502b1a5-dd27-4fe4-8023-53f2691d6105",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:16.341261Z",
     "iopub.status.busy": "2025-04-07T12:38:16.340260Z",
     "iopub.status.idle": "2025-04-07T12:38:23.463455Z",
     "shell.execute_reply": "2025-04-07T12:38:23.463455Z",
     "shell.execute_reply.started": "2025-04-07T12:38:16.341261Z"
    }
   },
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "from openqaoa.utilities import ground_state_hamiltonian\n",
    "from openqaoa.problems import MaximumCut\n",
    "from mindquantum.core.operators import QubitOperator\n",
    "\n",
    "def get_ham(nodes, W, ground=True):\n",
    "    G = nx.from_numpy_array(W)\n",
    "    \n",
    "    if ground:  # ground_state_hamiltonian 接口建议nodes <= 20,大比特下无法求解，所以定义为一个选项\n",
    "        energy, configuration = ground_state_hamiltonian(MaximumCut(G).qubo.hamiltonian)\n",
    "        print(f\"Ground State energy: {energy/2}, Gonfiguration: {configuration}\")\n",
    "\n",
    "    edges = G.edges()\n",
    "    weights = [G[u][v]['weight'] for u, v in edges]\n",
    "    ham = QubitOperator()\n",
    "    for w, (i, j) in zip(weights, edges):\n",
    "        ham += QubitOperator(f'Z{i} Z{j}', w / 2)\n",
    "    return ham"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f1d7340-2e7c-41f6-a0a7-2fba396f0510",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 1.2 对当前线路施加的门计算梯度\n",
    "\n",
    "$Grad_{mixer} = \\displaystyle -i\\langle \\psi\\,|[H_c,\\,mixer]|\\,\\psi\\rangle$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f3d42bda-0c7e-43f7-8c81-df5c92e3cbcd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:28.401541Z",
     "iopub.status.busy": "2025-04-07T12:38:28.400516Z",
     "iopub.status.idle": "2025-04-07T12:38:28.415511Z",
     "shell.execute_reply": "2025-04-07T12:38:28.414512Z",
     "shell.execute_reply.started": "2025-04-07T12:38:28.401541Z"
    }
   },
   "outputs": [],
   "source": [
    "from mindquantum.simulator import Simulator\n",
    "from mindquantum.core.operators import Hamiltonian\n",
    "\n",
    "def get_exp(circ, ham, sim):\n",
    "    exp = sim.get_expectation(Hamiltonian(ham), circ)\n",
    "    sim.reset()\n",
    "    return exp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0bbb68e6-a1c2-4af8-b7ed-221c48f3551a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:28.848709Z",
     "iopub.status.busy": "2025-04-07T12:38:28.848709Z",
     "iopub.status.idle": "2025-04-07T12:38:28.857707Z",
     "shell.execute_reply": "2025-04-07T12:38:28.856709Z",
     "shell.execute_reply.started": "2025-04-07T12:38:28.848709Z"
    }
   },
   "outputs": [],
   "source": [
    "from mindquantum.core.operators import commutator\n",
    "def derivative(ham, mixer, circ, sim):\n",
    "    commu = (-1j) * commutator(ham, QubitOperator(mixer))\n",
    "    expectation = get_exp(circ, commu, sim)\n",
    "    sim.reset()\n",
    "    return expectation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56ecac0c-f64f-44bb-bfb3-2366af7e68a9",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 1.3 提取字符串形式mixer中的数字\n",
    "\n",
    "k, j = extract_numbers('Ak Bj')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "973ce1ca-3da3-4688-8c3c-737629d6be71",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:31.648833Z",
     "iopub.status.busy": "2025-04-07T12:38:31.647833Z",
     "iopub.status.idle": "2025-04-07T12:38:31.663833Z",
     "shell.execute_reply": "2025-04-07T12:38:31.662830Z",
     "shell.execute_reply.started": "2025-04-07T12:38:31.648833Z"
    }
   },
   "outputs": [],
   "source": [
    "import re\n",
    "def extract_numbers(s):\n",
    "    match = re.match(r'(\\D+)(\\d+) (\\D+)(\\d+)', s)\n",
    "    if match:\n",
    "        n = int(match.group(2))\n",
    "        m = int(match.group(4))\n",
    "        return n, m"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be96f950-4d30-42c6-b94b-eb2b84f95e5b",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 1.4 添加一层分解形式的 Ryz 门\n",
    "\n",
    "$e^{i \\frac{\\pi}{4} Y_l Z_m} = S_lH_m CNOT_{l,m} RX_l (-\\frac{\\pi}{2}) CNOT_{l,m} S^\\dagger_lH_m$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8b3dbeb7-90ca-40b5-bdd7-e3a283157a62",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:34.460782Z",
     "iopub.status.busy": "2025-04-07T12:38:34.460782Z",
     "iopub.status.idle": "2025-04-07T12:38:34.479783Z",
     "shell.execute_reply": "2025-04-07T12:38:34.478784Z",
     "shell.execute_reply.started": "2025-04-07T12:38:34.460782Z"
    }
   },
   "outputs": [],
   "source": [
    "from mindquantum.core.gates import H, Z, X, CNOT, S\n",
    "\n",
    "def add_layer(circ, l, m):\n",
    "    circ += Z.on(l)\n",
    "    circ += S.on(l)\n",
    "\n",
    "    circ += H.on(m)\n",
    "    circ.barrier()\n",
    "    circ += CNOT(m, l)\n",
    "    circ.barrier()\n",
    "\n",
    "    circ += Z.on(l)\n",
    "    circ += S.on(l)\n",
    "    circ += Z.on(l)\n",
    "    circ += H.on(l)\n",
    "    circ += Z.on(l)\n",
    "    circ += S.on(l)\n",
    "    circ += Z.on(l)\n",
    "\n",
    "    circ.barrier()\n",
    "    circ += CNOT(m, l)\n",
    "    circ.barrier()\n",
    "    circ += S.on(l)\n",
    "\n",
    "    circ += H.on(m)\n",
    "    circ.barrier()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8be2fcac-f0c3-4a9d-bde6-c8bf76e57784",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 1.5 Adapt_Clifford 算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7b6265a3-517a-4d02-be2d-00c2428e3b2d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:37.404048Z",
     "iopub.status.busy": "2025-04-07T12:38:37.404048Z",
     "iopub.status.idle": "2025-04-07T12:38:37.427017Z",
     "shell.execute_reply": "2025-04-07T12:38:37.426019Z",
     "shell.execute_reply.started": "2025-04-07T12:38:37.404048Z"
    }
   },
   "outputs": [],
   "source": [
    "from mindquantum.core.circuit import Circuit\n",
    "from mindquantum.simulator import Simulator\n",
    "\n",
    "def adapt_clifford(nodes, t, ham):\n",
    "    all_qubits = list(range(nodes))\n",
    "    sim = Simulator('stabilizer', nodes) # 定义stabilizer模拟器\n",
    "    \n",
    "    layer = 0\n",
    "\n",
    "    aqubits = [t]  # 初始随机激活一个比特 t∈[0, nodes)\n",
    "    inaqubits = [n for n in all_qubits if n != t]\n",
    "    mixers = [f'Y{i} Z{j}' for i in aqubits for j in inaqubits] # 第一层的mixer集\n",
    "\n",
    "    circ = Circuit().un(H,range(nodes)).z(t) #初始线路\n",
    "\n",
    "    mixers_used = [] # 所有添加的mixer\n",
    "    while True:\n",
    "        gradients = []\n",
    "        for mixer in mixers:\n",
    "            gradients.append(derivative(ham, mixer, circ, sim)) # 对当前mixer集求梯度\n",
    "        target_mixer = mixers[np.argmax(gradients)] # 找到使哈密顿量梯度下降最大的那个mixer\n",
    "        mixers_used.append(target_mixer)\n",
    "        \n",
    "        # 新激活的比特为 j\n",
    "        if layer == 0:\n",
    "            k, j = extract_numbers(target_mixer) \n",
    "            add_layer(circ, k, j)\n",
    "        if layer > 0:\n",
    "            k, j = extract_numbers(target_mixer) \n",
    "            add_layer(circ, j, k)\n",
    "\n",
    "        aqubits.append(j)\n",
    "        inaqubits.remove(j)\n",
    "\n",
    "        mixers = [f'Z{i} Y{j}' for i in aqubits for j in inaqubits] # 后面层的mixer集\n",
    "        layer += 1\n",
    "        \n",
    "        if layer == nodes - 1: # 对于一个n比特问题，只需n-1层\n",
    "            return get_exp(circ, ham, sim), circ, mixers_used"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0466c49-ac27-4cba-93b5-3fd904d0cfc4",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 实例测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0087d707-16af-4af9-911b-494b7ce47f1f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:41.237589Z",
     "iopub.status.busy": "2025-04-07T12:38:41.236590Z",
     "iopub.status.idle": "2025-04-07T12:38:41.275592Z",
     "shell.execute_reply": "2025-04-07T12:38:41.274592Z",
     "shell.execute_reply.started": "2025-04-07T12:38:41.237589Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ground State energy: -3.4640045792129825, Gonfiguration: ['0110010110', '1001101001']\n"
     ]
    }
   ],
   "source": [
    "nodes = 10\n",
    "W = adj_matrix_complete(nodes)\n",
    "ham = get_ham(nodes, W, ground=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6cac8333-6397-4464-b1a7-9e1910a23ffe",
   "metadata": {},
   "source": [
    "#### Randomized 方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "65cf87dd-5a12-4d0f-ab64-c10462e0d876",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:42.897462Z",
     "iopub.status.busy": "2025-04-07T12:38:42.897462Z",
     "iopub.status.idle": "2025-04-07T12:38:43.090844Z",
     "shell.execute_reply": "2025-04-07T12:38:43.090844Z",
     "shell.execute_reply.started": "2025-04-07T12:38:42.897462Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 -3.178392099684092\n",
      "['Y1 Z6', 'Z1 Y0', 'Z6 Y3', 'Z6 Y4', 'Z1 Y8', 'Z6 Y7', 'Z1 Y9', 'Z6 Y5', 'Z1 Y2']\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "t = random.choice(range(nodes))\n",
    "res, circ, mixers_used = adapt_clifford(nodes, t, ham)\n",
    "print(t, res)\n",
    "print(mixers_used)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d92780f8-9640-464c-9937-d64a98bf4e72",
   "metadata": {},
   "source": [
    "#### Deterministic 方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3b01cb5d-f0dd-4050-a5d9-a174443ad457",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:44.789171Z",
     "iopub.status.busy": "2025-04-07T12:38:44.788172Z",
     "iopub.status.idle": "2025-04-07T12:38:46.568139Z",
     "shell.execute_reply": "2025-04-07T12:38:46.567169Z",
     "shell.execute_reply.started": "2025-04-07T12:38:44.789171Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 -3.4640045792129825\n",
      "1 -3.178392099684092\n",
      "2 -3.4640045792129825\n",
      "3 -3.178392099684092\n",
      "4 -3.178392099684092\n",
      "5 -3.4640045792129825\n",
      "6 -3.178392099684092\n",
      "7 -3.3573582063718774\n",
      "8 -3.3573582063718774\n",
      "9 -3.4640045792129825\n",
      "the minimum energy: -3.4640045792129825\n"
     ]
    }
   ],
   "source": [
    "res_lst = []\n",
    "for t in range(nodes):\n",
    "    res, circ, mixers_used = adapt_clifford(nodes, t, ham)\n",
    "    print(t, res)\n",
    "    res_lst.append(res)\n",
    "print(\"the minimum energy:\", min(res_lst))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f5c0bae-b3fb-4928-a60b-5b739095fd27",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## 4 热启动 warm state：\n",
    "\n",
    "通过经典的半正定规划，Burer-Monteiro 降秩方法得到一个粗解，并由此初态开始进行优化。已证明热启动能有效地提高 QAOA 和 Adapt QAOA 算法的精度。优化的矩阵可看做为N个二维(k=2)或三维(k=3)向量，分别对应着N个比特，将每个比特制备成所对应向量的初态，即可实现warm state。请注意，单位圆(k=2)与单位球(k=3)中，量子态采样结果与随机超平面法不同，采样结果取决于所有态的位置，所以在制备warm state前，需要通过全局旋转：随机选择一个态将其旋转到$|0\\rangle$上，分别求能量，选择能量值最低的那个初态。\n",
    "\n",
    "！！由于在Clifford线路中无法实现随机参数，所以通过热启动得到一个0/1串，将其制备成初态。\n",
    "\n",
    "## 5 Burer-Monteiro 方法：\n",
    "\n",
    "半正定规划求解 MaxCut 问题的形式为：\n",
    "$$miximize\\,\\,\\langle -A, X^T X \\rangle$$\n",
    "$$subject\\,\\,to\\,\\,||x_i||_2=1, \\forall i \\in [n]$$\n",
    "$$x_i \\in \\mathbb{R}^n, \\forall i \\in [n]$$\n",
    "当n=N的时候，即为Geomans-Williamson算法。而当n=k<<N的时候即为Burer-Monteiro 方法。通过将秩降到k=2,3，可实现粗略求解。\n",
    "\n",
    "## 6 验证 warm Adapt Clifford 算法可行性：\n",
    "\n",
    "结论：我们发现，由热启动得到的0/1态，将$|1\\rangle$视为__伪激活比特__，并从$|1\\rangle$中随机选择一个比特_x_作为初始比特进行求解，其解等于 adapt_clifford(x) 的解。并且0串的解集与1串的解集互补，共同组成原deterministic方法的解集，并一一对应。进一步我们发现，不管是randomized方法还是deterministic方法，热启动的解对0/1串无指向性，对长/短无指向性。即：无法通过热启动来缩小初始比特作用的位置而缩小deterministic方法的随机性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4088c236-ccb9-4671-8fd2-1d17415a6c35",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.1 Burer-Monteiro 方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "756b8d8f-ea8d-4f48-9740-771b1f5560cb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:38:55.080934Z",
     "iopub.status.busy": "2025-04-07T12:38:55.080934Z",
     "iopub.status.idle": "2025-04-07T12:38:58.342396Z",
     "shell.execute_reply": "2025-04-07T12:38:58.341392Z",
     "shell.execute_reply.started": "2025-04-07T12:38:55.080934Z"
    }
   },
   "outputs": [],
   "source": [
    "import pymanopt\n",
    "import autograd.numpy as anp\n",
    "from pymanopt.manifolds import Product\n",
    "from pymanopt.optimizers import TrustRegions\n",
    "\n",
    "def burer_monteiro_method(adj_matrix, nodes, k):\n",
    "    # Define Product manifolds\n",
    "    manifold = Product([pymanopt.manifolds.Sphere(k) for _ in range(nodes)])\n",
    "\n",
    "    @pymanopt.function.autograd(manifold)\n",
    "    # Define the cost function\n",
    "    def objective(*X):\n",
    "        X = anp.stack(X, axis=0)  # matrix form\n",
    "        return anp.trace(adj_matrix @ (X @ X.T))\n",
    "\n",
    "    problem = pymanopt.Problem(manifold, objective)\n",
    "    optimizer = TrustRegions(max_iterations=1000, min_gradient_norm=1e-6, verbosity=0)\n",
    "    result = optimizer.run(problem)\n",
    "    X_opt = anp.stack(result.point, axis=0)\n",
    "    return X_opt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e8d3ab6-1331-468c-9229-cc61d29cb69b",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.2 粗解0/1串"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "124c15c5-f3a9-4114-a189-0155377ff721",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:03.412994Z",
     "iopub.status.busy": "2025-04-07T12:39:03.411995Z",
     "iopub.status.idle": "2025-04-07T12:39:03.435997Z",
     "shell.execute_reply": "2025-04-07T12:39:03.434999Z",
     "shell.execute_reply.started": "2025-04-07T12:39:03.412994Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_cut(X_op, adj_matrix, num_samples):\n",
    "    #\n",
    "        # 得到的cut一定能消除对称性与平衡性\n",
    "    #\n",
    "    n, k = X_op.shape\n",
    "    best_cut = None\n",
    "    best_cut_value = -np.inf\n",
    "    for _ in range(num_samples):\n",
    "        r = np.random.randn(k)\n",
    "        r /= np.linalg.norm(r)\n",
    "        x = np.sign(X_op @ r)\n",
    "\n",
    "        cut_value = np.sum(adj_matrix * (x[:, None] != x)) // 2\n",
    "        if cut_value > best_cut_value:\n",
    "            best_cut_value = cut_value\n",
    "            best_cut = x.copy()\n",
    "\n",
    "    if np.sum(best_cut == 1) == np.sum(best_cut == -1):\n",
    "        best_cut[np.random.choice(n)] *= -1     # 消除平衡性\n",
    "    if best_cut[0] == -1:\n",
    "        best_cut = -best_cut        # 消除对称性\n",
    "    return [0 if x == -1 else 1 for x in best_cut]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cc80a7d-d3b0-4439-b9fc-6c3b7e6537ba",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.3 分别提取0/1串中0的索引和1的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1eb537c6-cef4-4443-a94c-2f8a19918aa2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:08.958484Z",
     "iopub.status.busy": "2025-04-07T12:39:08.957487Z",
     "iopub.status.idle": "2025-04-07T12:39:08.972482Z",
     "shell.execute_reply": "2025-04-07T12:39:08.971486Z",
     "shell.execute_reply.started": "2025-04-07T12:39:08.958484Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_targets(cut):\n",
    "    indices_0 = [i for i, x in enumerate(cut) if x == 0]\n",
    "    indices_1 = [i for i, x in enumerate(cut) if x == 1]\n",
    "    return indices_0, indices_1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21870230-1009-4cb3-8379-a3599e50205f",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.4 制备定性的初态及粗解的能量值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "05dfbe5e-caa1-41a0-89ad-a19612b4937f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:11.419707Z",
     "iopub.status.busy": "2025-04-07T12:39:11.419707Z",
     "iopub.status.idle": "2025-04-07T12:39:11.436707Z",
     "shell.execute_reply": "2025-04-07T12:39:11.435709Z",
     "shell.execute_reply.started": "2025-04-07T12:39:11.419707Z"
    }
   },
   "outputs": [],
   "source": [
    "def warm_state_qualitative(target_qubits, ham, nodes, sim):\n",
    "    circ = Circuit().un(X, target_qubits)\n",
    "    exp = get_exp(circ, ham, sim)\n",
    "    circ.un(H, range(nodes))\n",
    "    circ.barrier()\n",
    "    return circ, exp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5e9dd8c8-eee3-46df-aebb-fab9457e8b28",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.5 warm_adapt_clifford"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a3d92cf9-bb5e-4dbb-84b6-85316750a4bd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:14.179396Z",
     "iopub.status.busy": "2025-04-07T12:39:14.179396Z",
     "iopub.status.idle": "2025-04-07T12:39:14.194395Z",
     "shell.execute_reply": "2025-04-07T12:39:14.193398Z",
     "shell.execute_reply.started": "2025-04-07T12:39:14.179396Z"
    }
   },
   "outputs": [],
   "source": [
    "import copy\n",
    "def warm_adapt_clifford(nodes, t, ham, circ_warm):\n",
    "    all_qubits = list(range(nodes))\n",
    "    sim = Simulator('stabilizer', nodes)\n",
    "    \n",
    "    layer = 0\n",
    "    circ = copy.deepcopy(circ_warm)\n",
    "    \n",
    "    aqubits = [t]\n",
    "    inaqubits = [n for n in all_qubits if n != t]\n",
    "    mixers = [f'Y{i} Z{j}' for i in aqubits for j in inaqubits]\n",
    "    mixers_used = []\n",
    "    while True:\n",
    "        gradients = []\n",
    "        for mixer in mixers:\n",
    "            gradients.append(derivative(ham, mixer, circ, sim))\n",
    "        target_mixer = mixers[np.argmax(gradients)]\n",
    "        mixers_used.append(target_mixer)\n",
    "        \n",
    "        if layer == 0:\n",
    "            k, j = extract_numbers(target_mixer)\n",
    "            add_layer(circ, k, j)\n",
    "        if layer > 0:\n",
    "            k, j = extract_numbers(target_mixer)\n",
    "            add_layer(circ, j, k)\n",
    "\n",
    "        aqubits.append(j)\n",
    "        inaqubits.remove(j)\n",
    "\n",
    "        mixers = [f'Z{i} Y{j}' for i in aqubits for j in inaqubits]\n",
    "        layer += 1\n",
    "        if layer == nodes - 1:\n",
    "            return get_exp(circ, ham, sim), circ, mixers_used"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1580d12-4832-4bc3-a834-39767ff53668",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 实例测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0642cab3-aefd-421c-8797-ddd37695d070",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:17.471607Z",
     "iopub.status.busy": "2025-04-07T12:39:17.471607Z",
     "iopub.status.idle": "2025-04-07T12:39:17.554608Z",
     "shell.execute_reply": "2025-04-07T12:39:17.554608Z",
     "shell.execute_reply.started": "2025-04-07T12:39:17.471607Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ground State energy: -6.520889802257112, Gonfiguration: ['001101110001110', '110010001110001']\n"
     ]
    }
   ],
   "source": [
    "nodes = 15\n",
    "W = adj_matrix_complete(nodes)\n",
    "ham = get_ham(nodes, W, ground=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e9422eb8-f918-4612-9f1e-b99f5a220820",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:18.940830Z",
     "iopub.status.busy": "2025-04-07T12:39:18.940830Z",
     "iopub.status.idle": "2025-04-07T12:39:34.835788Z",
     "shell.execute_reply": "2025-04-07T12:39:34.834788Z",
     "shell.execute_reply.started": "2025-04-07T12:39:18.940830Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "deterministic method:\n",
      "0 -6.460736322966745\n",
      "1 -6.460736322966745\n",
      "2 -6.460736322966745\n",
      "3 -6.460736322966745\n",
      "4 -6.206584078307759\n",
      "5 -6.206584078307759\n",
      "6 -6.206584078307759\n",
      "7 -6.520889802257112\n",
      "8 -6.460736322966745\n",
      "9 -6.460736322966745\n",
      "10 -6.460736322966745\n",
      "11 -6.460736322966745\n",
      "12 -6.520889802257112\n",
      "13 -6.460736322966745\n",
      "14 -6.460736322966745\n",
      "the minimum energy: -6.520889802257112\n",
      "CPU times: total: 15.9 s\n",
      "Wall time: 15.9 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res = []\n",
    "print(\"deterministic method:\")\n",
    "for t in range(nodes):\n",
    "    value,_,_ = adapt_clifford(nodes, t, ham)\n",
    "    print(t, value)\n",
    "    res.append(value)\n",
    "print(f'the minimum energy: {min(res)}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "22b7ecea-5599-4854-9487-104f8f49f370",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:36.720106Z",
     "iopub.status.busy": "2025-04-07T12:39:36.720106Z",
     "iopub.status.idle": "2025-04-07T12:39:37.621768Z",
     "shell.execute_reply": "2025-04-07T12:39:37.620770Z",
     "shell.execute_reply.started": "2025-04-07T12:39:36.720106Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0-string target qubits: [2, 3, 5, 6, 7, 11, 12, 13]\n",
      "1-string target qubits: [0, 1, 4, 8, 9, 10, 14]\n",
      "the initial energy: -6.520889802257112 -6.520889802257112\n"
     ]
    }
   ],
   "source": [
    "X_op = burer_monteiro_method(W, nodes, 3)\n",
    "cut = get_cut(X_op, W, num_samples=100)\n",
    "target_0, target_1 = get_targets(cut)\n",
    "print(f'0-string target qubits: {target_0}\\n1-string target qubits: {target_1}')\n",
    "sim = Simulator('stabilizer', nodes)\n",
    "circ_warm0, exp_warm0 = warm_state_qualitative(target_0, ham, nodes, sim)\n",
    "circ_warm1, exp_warm1 = warm_state_qualitative(target_1, ham, nodes, sim)\n",
    "print(\"the initial energy:\",exp_warm0,exp_warm1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a061fc7e-d741-4bbc-a4a2-daf1d9a64ef9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:39.315899Z",
     "iopub.status.busy": "2025-04-07T12:39:39.314899Z",
     "iopub.status.idle": "2025-04-07T12:39:47.730213Z",
     "shell.execute_reply": "2025-04-07T12:39:47.729213Z",
     "shell.execute_reply.started": "2025-04-07T12:39:39.315899Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0-string warm:\n",
      "2 -6.460736322966745\n",
      "3 -6.460736322966745\n",
      "5 -6.206584078307759\n",
      "6 -6.206584078307759\n",
      "7 -6.520889802257112\n",
      "11 -6.460736322966745\n",
      "12 -6.520889802257112\n",
      "13 -6.460736322966745\n"
     ]
    }
   ],
   "source": [
    "res0 = []\n",
    "print(\"0-string warm:\")\n",
    "for t in target_0:\n",
    "    value0,_,_ = warm_adapt_clifford(nodes, t, ham, circ_warm0)\n",
    "    print(t, value0)\n",
    "    res0.append(value0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "88ac9778-3a72-4d7e-94b1-7b44d0c39e3b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:49.001732Z",
     "iopub.status.busy": "2025-04-07T12:39:49.001732Z",
     "iopub.status.idle": "2025-04-07T12:39:56.329921Z",
     "shell.execute_reply": "2025-04-07T12:39:56.329921Z",
     "shell.execute_reply.started": "2025-04-07T12:39:49.001732Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1-string warm:\n",
      "0 -6.460736322966745\n",
      "1 -6.460736322966745\n",
      "4 -6.206584078307759\n",
      "8 -6.460736322966745\n",
      "9 -6.460736322966745\n",
      "10 -6.460736322966745\n",
      "14 -6.460736322966745\n"
     ]
    }
   ],
   "source": [
    "res1 = []\n",
    "print(\"1-string warm:\")\n",
    "for t in target_1:\n",
    "    value1,_,_ = warm_adapt_clifford(nodes, t, ham, circ_warm1)\n",
    "    print(t, value1)\n",
    "    res1.append(value1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "711076e1-da52-4fe5-bcad-08cb506b2fb3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:39:58.352636Z",
     "iopub.status.busy": "2025-04-07T12:39:58.352636Z",
     "iopub.status.idle": "2025-04-07T12:39:58.358638Z",
     "shell.execute_reply": "2025-04-07T12:39:58.357635Z",
     "shell.execute_reply.started": "2025-04-07T12:39:58.352636Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "deterministic result: {0: -6.460736322966745, 1: -6.460736322966745, 2: -6.460736322966745, 3: -6.460736322966745, 4: -6.206584078307759, 5: -6.206584078307759, 6: -6.206584078307759, 7: -6.520889802257112, 8: -6.460736322966745, 9: -6.460736322966745, 10: -6.460736322966745, 11: -6.460736322966745, 12: -6.520889802257112, 13: -6.460736322966745, 14: -6.460736322966745}\n",
      "0/1str merged result: {0: -6.460736322966745, 1: -6.460736322966745, 2: -6.460736322966745, 3: -6.460736322966745, 4: -6.206584078307759, 5: -6.206584078307759, 6: -6.206584078307759, 7: -6.520889802257112, 8: -6.460736322966745, 9: -6.460736322966745, 10: -6.460736322966745, 11: -6.460736322966745, 12: -6.520889802257112, 13: -6.460736322966745, 14: -6.460736322966745}\n",
      "0串结果与1串结果是互补的两个子集，其值分别对应deterministic方法的结果！\n"
     ]
    }
   ],
   "source": [
    "# 合并整合，验证结论\n",
    "dct_deterministic = {i:res[i] for i in range(nodes)}\n",
    "\n",
    "dct_0string = {target_0[i]:res0[i] for i in range(len(target_0))}\n",
    "dct_1string = {target_1[i]:res1[i] for i in range(len(target_1))}\n",
    "merged_dict = {**dct_0string, **dct_1string}\n",
    "sorted_dict = {k: merged_dict[k] for k in sorted(merged_dict)}\n",
    "\n",
    "print(\"deterministic result:\", dct_deterministic)\n",
    "print(\"0/1str merged result:\",sorted_dict)\n",
    "print(\"0串结果与1串结果是互补的两个子集，其值分别对应deterministic方法的结果！\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18103090-a15d-46b7-a17c-6ff91d3692d6",
   "metadata": {},
   "source": [
    "### 进一步验证\n",
    "\n",
    "为了进一步验证warm_adapt_clifford的可行性，取消原本 adapt_clifford 算法__激活/待激活__比特这一概念，定制一个全集池子pool，自行定义线路深度 layers，从 circ_warm 开始自行计算梯度 并添加逻辑门。取N=10，layers=15，并与randomized 方法进行对比，结果发现 circ_warm最终优化值 或大于 或小于 或等于 初始启动值，而且这个值始终无法到达 精确基态能量。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "243238f8-cdaa-4526-9ae9-6e6bbfbe9059",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.6 mixer池"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "87e7b75b-35c5-4223-bc2c-5c71cf681e09",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:06.129524Z",
     "iopub.status.busy": "2025-04-07T12:40:06.128524Z",
     "iopub.status.idle": "2025-04-07T12:40:06.141522Z",
     "shell.execute_reply": "2025-04-07T12:40:06.140552Z",
     "shell.execute_reply.started": "2025-04-07T12:40:06.129524Z"
    }
   },
   "outputs": [],
   "source": [
    "from itertools import product\n",
    "# 包含所有 YZ ZY算子\n",
    "def mixer_pool(nodes):\n",
    "    number_pairs = [f'{i}{j}' for i in range(nodes) for j in range(i + 1, nodes)]\n",
    "    letter_pairs = ['Y Z', 'Z Y']\n",
    "    pool = [f'{let[0]}{num[0]} {let[2]}{num[1]}' for num, let in product(number_pairs, letter_pairs)]\n",
    "    return pool"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32a66cd6-532d-4c08-9358-05d8f62848bf",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.7 提取辅助函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "e92817ee-34fd-45b4-988e-0ddaab528b58",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:08.436467Z",
     "iopub.status.busy": "2025-04-07T12:40:08.436467Z",
     "iopub.status.idle": "2025-04-07T12:40:08.456464Z",
     "shell.execute_reply": "2025-04-07T12:40:08.455494Z",
     "shell.execute_reply.started": "2025-04-07T12:40:08.436467Z"
    }
   },
   "outputs": [],
   "source": [
    "def extract(s):\n",
    "    match = re.match(r'(\\D+)(\\d+) (\\D+)(\\d+)', s)\n",
    "    if match:\n",
    "        n = int(match.group(2))\n",
    "        m = int(match.group(4))\n",
    "        p = str(match.group(1))\n",
    "        q = str(match.group(3))\n",
    "        return (n, m), (p+q)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef6b3dcb-f80e-4824-a085-81903f32ec90",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 2.8 warm_adapt_clifford_with_pool"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "19581694-2770-4cdb-a500-8f72c3310593",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:11.498458Z",
     "iopub.status.busy": "2025-04-07T12:40:11.497457Z",
     "iopub.status.idle": "2025-04-07T12:40:11.514453Z",
     "shell.execute_reply": "2025-04-07T12:40:11.513454Z",
     "shell.execute_reply.started": "2025-04-07T12:40:11.498458Z"
    }
   },
   "outputs": [],
   "source": [
    "def test_warm_adapt_clifford(nodes, ham_op, circ_warm, exp_warm, pool, layers):\n",
    "\n",
    "    layer = 0\n",
    "    sim = Simulator('stabilizer', nodes)\n",
    "    circ = copy.deepcopy(circ_warm)\n",
    "    values = [exp_warm]\n",
    "    mixers_used = []\n",
    "\n",
    "    while True:\n",
    "        gradients = []\n",
    "        for mixer in pool:\n",
    "            gradients.append(derivative(ham, mixer, circ, sim))\n",
    "        mixer = pool[np.argmax(gradients)]\n",
    "        mixers_used.append(mixer)\n",
    "\n",
    "        (k, j), s = extract(mixer)\n",
    "        if s == 'YZ':\n",
    "            add_layer(circ, k, j)\n",
    "        if s == 'ZY':\n",
    "            add_layer(circ, j, k)\n",
    "\n",
    "        values.append(get_exp(circ, ham, sim))\n",
    "        layer += 1\n",
    "        if layer == layers:\n",
    "            return values,mixers_used"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "52f12179-0ab1-42b7-8564-6dcabbe5684f",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 进一步验证结果\n",
    "\n",
    "结论：热启动方法无法与adapt_clifford算法相结合。原因在于，由热启动得到的 定性0/1串的初态 warm_state_qualitative，一开始具有一个较好的初始能量，但对每个比特施加Hadamard门之后 能量值又回归于0，使其无法提取到热启动的信息。所以要保持热启动信息，就不能施加Hadamard门，在此基础上，就无法使用只能在$|\\pm\\rangle$空间中求解的adapt_clifford算法。\n",
    "\n",
    "由文献Warm-starting quantum optimization中可知，对于一个warm-state，其最优路径是 adjusted_mixer，而这个混合层无需使用纠缠逻辑门。所以 从该定性初态出发进行求解的最佳算法 为贪心算法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "8f547359-83ba-4150-9305-26aa8b9efde3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:44.425259Z",
     "iopub.status.busy": "2025-04-07T12:40:44.425259Z",
     "iopub.status.idle": "2025-04-07T12:40:44.946865Z",
     "shell.execute_reply": "2025-04-07T12:40:44.945866Z",
     "shell.execute_reply.started": "2025-04-07T12:40:44.425259Z"
    }
   },
   "outputs": [],
   "source": [
    "nodes = 10\n",
    "W = adj_matrix_complete(nodes)\n",
    "ham = get_ham(nodes, W, ground=False)\n",
    "\n",
    "G = nx.from_numpy_array(W)\n",
    "energy, _ = ground_state_hamiltonian(MaximumCut(G).qubo.hamiltonian)\n",
    "energy = energy / 2\n",
    "\n",
    "X_op = burer_monteiro_method(W, nodes, 3)\n",
    "cut = get_cut(X_op, W, num_samples=100)\n",
    "target_0, target_1 = get_targets(cut)\n",
    "circ_warm0, exp_warm0 = warm_state_qualitative(target_0, ham, nodes, sim)\n",
    "circ_warm1, exp_warm1 = warm_state_qualitative(target_1, ham, nodes, sim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "e8f8c4ff-4934-4e99-8d6f-c5a4cd7890ef",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:46.090916Z",
     "iopub.status.busy": "2025-04-07T12:40:46.090916Z",
     "iopub.status.idle": "2025-04-07T12:40:46.111913Z",
     "shell.execute_reply": "2025-04-07T12:40:46.110915Z",
     "shell.execute_reply.started": "2025-04-07T12:40:46.090916Z"
    }
   },
   "outputs": [],
   "source": [
    "circ_standard = Circuit().un(H, range(nodes)).z(random.choice(list(range(nodes))))  # 标准启动\n",
    "\n",
    "pool = mixer_pool(nodes)\n",
    "layers = 15  # 自定义线路深度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "7c30f2ca-d4a4-48fe-922e-c8d03c36ced9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:46.939620Z",
     "iopub.status.busy": "2025-04-07T12:40:46.939620Z",
     "iopub.status.idle": "2025-04-07T12:40:50.943618Z",
     "shell.execute_reply": "2025-04-07T12:40:50.942616Z",
     "shell.execute_reply.started": "2025-04-07T12:40:46.939620Z"
    }
   },
   "outputs": [],
   "source": [
    "values0,_ = test_warm_adapt_clifford(nodes, ham, circ_warm0, exp_warm0, pool, layers)\n",
    "values1,_ = test_warm_adapt_clifford(nodes, ham, circ_warm1, exp_warm1, pool, layers)\n",
    "values,_ = test_warm_adapt_clifford(nodes, ham, circ_standard, 0, pool, layers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "bcfc26c0-f190-48ae-ad1a-da73af2d7436",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:40:51.616958Z",
     "iopub.status.busy": "2025-04-07T12:40:51.616958Z",
     "iopub.status.idle": "2025-04-07T12:40:51.889958Z",
     "shell.execute_reply": "2025-04-07T12:40:51.888955Z",
     "shell.execute_reply.started": "2025-04-07T12:40:51.616958Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.figure(figsize=(8, 6), facecolor='lightgray')\n",
    "plt.plot(list(range(layers+1)),values0,color='b',label='0-string')\n",
    "plt.plot(list(range(layers+1)),values1,color='r',label='1-string')\n",
    "plt.plot(list(range(layers + 1)), values, color='black', label='randomized adapt_clifford')\n",
    "plt.axhline(energy, color='gray', linestyle='--', linewidth=1,label='gound energy')\n",
    "\n",
    "plt.yticks(fontsize=20)\n",
    "plt.xticks(fontsize=20)\n",
    "plt.title(f'nodes=10 complete graph\\nwarm_clifford_with_pool', fontsize=20)\n",
    "plt.xlabel('Layers', fontsize=25)\n",
    "plt.ylabel('Energy', fontsize=25)\n",
    "plt.legend(fontsize=13)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7eab08cb-5a32-4ca5-a703-a7f02f38f111",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## 7 Adapt Clifford 算法的改写与封装\n",
    "\n",
    "上述 Adapt Clifford 算法 是通过计算对易式来求解梯度值，此方法在大比特实例中会产生大量的无效计算，导致运行时间过长。通过对大量实例的结果进行分析，因此这里对其进行代数方法的修改，使其能模拟更大比特的MaxCut问题。\n",
    "\n",
    "！！此代数法计算梯度来源于文献Muñoz-Arias M H, Kourtis S, Blais A. Low-depth Clifford circuits approximately solve MaxCut. Physical Review Research, 2024, 6(2): 023294.\n",
    "\n",
    "！！仅梯度计算使用与 MaxCut 问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ed9477b-9c17-448e-a587-0f3ab07703d9",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 3.1 梯度计算\n",
    "\n",
    "我们发现，在第一层确定两个激活比特k,j后，后续所有的Ryz门中的激活比特部分一定会从k,j中选取。根据此Clifford线路的特殊性，当选取某个待激活比特的时候，计算其对应的梯度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "8e42085c-38db-4d90-b58d-0b9a7d8156c4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:14.943732Z",
     "iopub.status.busy": "2025-04-07T12:41:14.943732Z",
     "iopub.status.idle": "2025-04-07T12:41:14.956731Z",
     "shell.execute_reply": "2025-04-07T12:41:14.955732Z",
     "shell.execute_reply.started": "2025-04-07T12:41:14.943732Z"
    }
   },
   "outputs": [],
   "source": [
    "def gradient(inaqubit, W, aqubits_k, aqubits_j):\n",
    "    \"\"\"\n",
    "    Given an inactive qubit, this function computes the gradient of it with\n",
    "    with respect to the two qubits defining the bipartition.\n",
    "\n",
    "    inaqubit: the inactibe qubit under consideration\n",
    "    W: a matrix of the edge weights\n",
    "    aqubits_k: the active qubits which were entangled with qubit k\n",
    "    aqubits_j: the active qubits which were entangled with qubit j\n",
    "    \"\"\"\n",
    "\n",
    "    lindex_k = np.intersect1d(np.nonzero(W[:, inaqubit])[0], aqubits_k)\n",
    "    lindex_j = np.intersect1d(np.nonzero(W[:, inaqubit])[0], aqubits_j)\n",
    "\n",
    "    sum_weights_k = np.sum(W[ll, inaqubit] for ll in lindex_k)\n",
    "    sum_weights_j = np.sum(W[ll, inaqubit] for ll in lindex_j)\n",
    "\n",
    "    grad_k = -sum_weights_k + sum_weights_j\n",
    "    return grad_k"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "205fc6eb-0d77-44d6-8ce6-e799aa3e6a26",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 3.2 梯度筛选\n",
    "\n",
    "计算得出使梯度下降最大的那个 待激活比特，并筛选出需要作用的Ryz门"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "680133e6-a95d-48dd-925b-1447678cc5dc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:18.353212Z",
     "iopub.status.busy": "2025-04-07T12:41:18.353212Z",
     "iopub.status.idle": "2025-04-07T12:41:18.368184Z",
     "shell.execute_reply": "2025-04-07T12:41:18.367219Z",
     "shell.execute_reply.started": "2025-04-07T12:41:18.353212Z"
    }
   },
   "outputs": [],
   "source": [
    "def pos_max_grad(inaqubits, W, aqubits_k, aqubits_j):\n",
    "    \"\"\"\n",
    "    This function finds the inactive qubit b with the largest gradient, and the\n",
    "    corresponding initial qubit, k or j, with which this largest gradient occurs\n",
    "\n",
    "    inaqubits: the vector of inactive qubits\n",
    "    W: a matrix of the edge weights\n",
    "    aqubits_k: the active qubits which were entangled with qubit k\n",
    "    aqubits_j: the active qubits which were entangled with qubitt j\n",
    "    \"\"\"\n",
    "\n",
    "    all_grads_k = [gradient(inaqubit, W, aqubits_k, aqubits_j) for inaqubit in inaqubits]\n",
    "    all_grads_j = -1.0 * np.array(all_grads_k)\n",
    "\n",
    "    pos_max_k = np.argmax(all_grads_k)\n",
    "    pos_max_j = np.argmax(all_grads_j)\n",
    "\n",
    "    if all_grads_k[pos_max_k] > all_grads_j[pos_max_j]:\n",
    "        return \"k\", inaqubits[pos_max_k], all_grads_k[pos_max_k]\n",
    "    elif all_grads_k[pos_max_k] < all_grads_j[pos_max_j]:\n",
    "        return \"j\", inaqubits[pos_max_j], all_grads_j[pos_max_j]\n",
    "    else:\n",
    "        char = np.random.choice([1, 2])\n",
    "        if char == 1:\n",
    "            return \"k\", inaqubits[pos_max_k], all_grads_k[pos_max_k]\n",
    "        elif char == 2:\n",
    "            return \"j\", inaqubits[pos_max_j], all_grads_j[pos_max_j]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f8bbe69-8f11-45da-98ef-f1c41574309b",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "#### 3.3 Adapt Clifford 算法(优化)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3e0dd673-9be1-4aef-9a59-c0379434de4d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:21.378901Z",
     "iopub.status.busy": "2025-04-07T12:41:21.378901Z",
     "iopub.status.idle": "2025-04-07T12:41:21.390902Z",
     "shell.execute_reply": "2025-04-07T12:41:21.389903Z",
     "shell.execute_reply.started": "2025-04-07T12:41:21.378901Z"
    }
   },
   "outputs": [],
   "source": [
    "def adapt_clifford_mq(nodes, t, ham, W):\n",
    "    circ = Circuit().un(H,range(nodes)).z(t)  # 线路初始化\n",
    "    sim = Simulator('stabilizer', nodes)\n",
    "    active_qubits_k = [t]  # 初始激活比特 t\n",
    "    active_qubits_j = []\n",
    "    inactive_qubits = [n for n in list(range(nodes)) if n != t]\n",
    "\n",
    "    mixers_used = []\n",
    "\n",
    "    d = max(range(len(W)), key=lambda x: W[x][t]) # 第一层的目标比特\n",
    "\n",
    "    for nn in range(nodes - 1):\n",
    "        if nn == 0:\n",
    "            target_qubit = d\n",
    "\n",
    "            gra = W[target_qubit, t]\n",
    "            qubits, grad = (t, target_qubit), gra\n",
    "\n",
    "            active_qubits_j.append(target_qubit)\n",
    "\n",
    "            inactive_qubits.remove(target_qubit)\n",
    "        else:\n",
    "            aset, target_qubit, _ = pos_max_grad(inactive_qubits, W, active_qubits_k, active_qubits_j)\n",
    "\n",
    "            if aset == \"k\":\n",
    "                qubits = (target_qubit, t)\n",
    "                active_qubits_k.append(target_qubit)\n",
    "            elif aset == \"j\":\n",
    "                qubits = (target_qubit, active_qubits_j[0])\n",
    "                active_qubits_j.append(target_qubit)\n",
    "            inactive_qubits.remove(target_qubit)\n",
    "\n",
    "        add_layer(circ, qubits[0], qubits[1])\n",
    "        mixers_used.append(qubits)\n",
    "\n",
    "    return get_exp(circ, ham, sim), circ, mixers_used"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5448e592-0a1a-4dae-a25d-b60ffa31eb47",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 实例测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "fe733f58-eb9c-42cd-a299-80172b9d49b9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:25.446392Z",
     "iopub.status.busy": "2025-04-07T12:41:25.445408Z",
     "iopub.status.idle": "2025-04-07T12:41:25.471380Z",
     "shell.execute_reply": "2025-04-07T12:41:25.470380Z",
     "shell.execute_reply.started": "2025-04-07T12:41:25.446392Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ground State energy: -3.3476198775169737, Gonfiguration: ['1101001100', '0010110011']\n"
     ]
    }
   ],
   "source": [
    "nodes = 10\n",
    "W = adj_matrix_complete(nodes)\n",
    "ham = get_ham(nodes, W, ground=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "ae26b07c-bdea-4f1d-8de8-3f7e0e0d4557",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:26.284973Z",
     "iopub.status.busy": "2025-04-07T12:41:26.284973Z",
     "iopub.status.idle": "2025-04-07T12:41:28.142617Z",
     "shell.execute_reply": "2025-04-07T12:41:28.142109Z",
     "shell.execute_reply.started": "2025-04-07T12:41:26.284973Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Admin\\AppData\\Local\\Temp\\ipykernel_18296\\628900130.py:15: DeprecationWarning: Calling np.sum(generator) is deprecated, and in the future will give a different result. Use np.sum(np.fromiter(generator)) or the python sum builtin instead.\n",
      "  sum_weights_k = np.sum(W[ll, inaqubit] for ll in lindex_k)\n",
      "C:\\Users\\Admin\\AppData\\Local\\Temp\\ipykernel_18296\\628900130.py:16: DeprecationWarning: Calling np.sum(generator) is deprecated, and in the future will give a different result. Use np.sum(np.fromiter(generator)) or the python sum builtin instead.\n",
      "  sum_weights_j = np.sum(W[ll, inaqubit] for ll in lindex_j)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 -3.0109445037259794 -3.0109445037259794\n",
      "1 -3.3476198775169737 -3.3476198775169737\n",
      "2 -3.0109445037259794 -3.0109445037259794\n",
      "3 -3.0109445037259794 -3.0109445037259794\n",
      "4 -3.3476198775169737 -3.3476198775169737\n",
      "5 -3.3476198775169737 -3.3476198775169737\n",
      "6 -3.3476198775169737 -3.3476198775169737\n",
      "7 -3.3476198775169737 -3.3476198775169737\n",
      "8 -3.3476198775169737 -3.3476198775169737\n",
      "9 -3.3476198775169737 -3.3476198775169737\n",
      "不改变结果\n"
     ]
    }
   ],
   "source": [
    "# 与优化前的算符比较\n",
    "for t in range(nodes):\n",
    "    res, _, _ = adapt_clifford(nodes, t, ham)\n",
    "    res_mq, _, _ = adapt_clifford_mq(nodes, t, ham, W)\n",
    "    print(t, res, res_mq)\n",
    "print(\"不改变结果\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "cb4d6eb2-9765-4710-99e2-8c04e022c4d3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-04-07T12:41:32.548263Z",
     "iopub.status.busy": "2025-04-07T12:41:32.548263Z",
     "iopub.status.idle": "2025-04-07T12:41:36.231381Z",
     "shell.execute_reply": "2025-04-07T12:41:36.230411Z",
     "shell.execute_reply.started": "2025-04-07T12:41:32.548263Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Admin\\AppData\\Local\\Temp\\ipykernel_18296\\628900130.py:15: DeprecationWarning: Calling np.sum(generator) is deprecated, and in the future will give a different result. Use np.sum(np.fromiter(generator)) or the python sum builtin instead.\n",
      "  sum_weights_k = np.sum(W[ll, inaqubit] for ll in lindex_k)\n",
      "C:\\Users\\Admin\\AppData\\Local\\Temp\\ipykernel_18296\\628900130.py:16: DeprecationWarning: Calling np.sum(generator) is deprecated, and in the future will give a different result. Use np.sum(np.fromiter(generator)) or the python sum builtin instead.\n",
      "  sum_weights_j = np.sum(W[ll, inaqubit] for ll in lindex_j)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "energy: -297.27391258134685\n",
      "CPU times: total: 3.66 s\n",
      "Wall time: 3.67 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "## 大比特测试\n",
    "nodes = 200\n",
    "W = adj_matrix_complete(nodes)\n",
    "ham = get_ham(nodes, W, ground=False)\n",
    "\n",
    "res_mq, _, _ = adapt_clifford_mq(nodes, t, ham, W)\n",
    "print(\"energy:\", res_mq)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
